// 入口文件
// 导入
const express = require('express')
// 创建
const app = express()
// 自定义模块
// const db = require('./database/index.js')
// md5无法逆运算 可以暴力破解 用bcrypt.js 
// 下载utility 导入 使用 password=utility.md5(password) 防止未加密的数据(脏数据)无法比对
// const utility = require('utility')
// 导入token生成  在发送登录成功之前生成
// const jwt = require('jsonwebtoken')

// 开放静态资源 写在token 之前
app.use('/upload', express.static('./uploads'))

// 解决跨域 最顶部 
const cors = require('cors')
app.use(cors())

// 第三中间件，下载 书写到最顶端 认证token
const expressJWT = require('express-jwt')

app.use(expressJWT({ secret: 'dijia' }).unless({ path: [/^\/api\//] }))
// 请求体配置  qs模块比较重，用express的urlencoded()配置{extended:false}
// app.use()不管路由操作是get和post都会通过app.use()挂载路由对象 忽略请求方式 指定访问路径（前缀）
app.use(express.urlencoded({ extended: false }))

// 导入路由模块
const loginRouter = require('./router/login.js')
// 挂载路由 他会忽略路由方式 可以设置前缀 进行拦截
app.use('/api', loginRouter)
// 测试 获取用户信息路由  测试完注释 在user有相同路由
// app.get('/my/userinfo',(req,res)=>{
// 经过expressJWT中间件的解析，会在req.user属性(之前有req.body)中返回token加密的对象即{ id: results[0].id } 包还有其他属性
//     console.log(req.user);
//     res.send('获取用户信息成功！')
// })
// 个人中心路由  注意顺序
const userRouter = require('./router/user')
app.use('/my', userRouter)


// 文章分类路由
const cateRouter = require('./router/cate')
app.use('/my/article', cateRouter)
// 文章列表
const artcleRouter = require("./router/article")
app.use('/my', artcleRouter)


// 资源路径一致看请求方式是否相同

// 书写端口， 注册端口
// get请求在params post在body
// app.post('/api/reguser', (req, res) => {
//     // 后端接收post请求体用req.body接收，不能直接写，需要配置
//     // console.log(req.body);
//     // 发送之前 定义sql语句根据用户名查询是否已有用户
//     // 解构赋值
//     let { username, password } = req.body
//     password = utility.md5(password)
//     // sql语句
//     let sql = `select * from user where username='${username}'`
//     db(sql, (err, results) => {
//         // 判断sql语句
//         if (err) {
//             console.log(err);
//             return res.send({ status: 1, message: 'sql语法错误' + err.message })
//         }
//         // 判断查询 results返回的是一个数组
//         if (results.length >= 1) {
//             return res.send({ status: 1, message: '用户名已存在，请更换用户名' })
//         }
//         // 在查询里面 做插入 不能写在外面  let暂时性死区 本身有外面的let无法进入
//         // 数据操作
//         let sql = `insert into user set username="${username}",password="${password}"`;
//         db(sql, (err, results) => {
//             // 判断sql语句
//             if (err) {
//                 return res.send({ status: 1, message: 'sql语法错误' + err.message })
//             }
//             if (results.affectedRows !== 1) {
//                 return res.send({ status: 1, message: '添加失败！' })
//             }
//             // 请求成功 响应数据 不能有两个 res.send 会报错
//             res.send({ status: 0, message: '注册成功！' })

//         })
//     })
//     // res.send({ status: 0, message: '登录成功！' })
// })
//代码堆积不易维护，入口文件接口太多
// 登录端口
// app.post('/api/login', (req, res) => {
//     // 接收post参数  用let 未来要加密
//     let { username, password } = req.body
//     // 加密密码
//     password = utility.md5(password)
//     // 在sql语句中用and 判断一次就行
//     let sql = `select * from user where username="${username}" and password="${password}"`
//     // console.log(username, password);
//     // 操作数据
//     db(sql, (err, results) => {
//         if (err) {
//             return res.send({ message: err.message, status: 1 })
//         }
//         // 用户是否存在
//         if (results.length === 0) {
//             return res.send({ message: '用户名或者密码错误', status: 1 })
//         }
//         //  npm i jsonwebtoken@8.5.1 在发送登录成功之前生成 jwt的sign方法对象，字符串，对象，在开始加Bearer加一个空格不能多不能少 ，最后发送给用户
//         // 第一个参数 对象{ id: results[0].id } results是一个数组，加密的对象的id唯一
//         const token ='Bearer '+ jwt.sign({ id: results[0].id }, 'dijia', { expiresIn: '24h' })
//         // 模块化路由，抽离单独的路由文件

//         // 不能使用两次  send  
//         res.send({ message: '登录成功！', status: 0 , token:token})
//     })
//     // Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
//     // res.send({ message: '登录成功！', status: 0 })

// })
// 定义 错误处理中间件
app.use((err, req, res, next) => {
    // err对象有两个属性 name和message
    // console.log(err.name);
    if (err.name === 'UnauthorizedError') {
        // 和前端保持一致，否则不会跳转
        err.message = '身份认证失败！'
    }
    res.send({
        status: 1,
        message: err.message
    })
})
// 启动
app.listen(3007, function () {
    console.log('http://127.0.0.1:3007');
})
